home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / intuisup.lha / Intuisup / source.lha / Editor / editor.c < prev    next >
C/C++ Source or Header  |  1992-10-02  |  25KB  |  912 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: editor.c
  6.  *    Created ..: Sunday 22-Dec-91 21:22:28
  7.  *    Revision .: 1
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    02-Oct-92   Michael Bjerking       New realese, better Screen/Window editor
  12.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  13.  *
  14.  ****************************************************************************
  15.  *
  16.  *    Editor main display
  17.  *
  18.  * $Revision Header ********************************************************/
  19.  
  20.  /* Includes */
  21.  
  22. #include "includes.h"
  23. #include "defines.h"
  24. #include "imports.h"
  25. #include "protos.h"
  26.  
  27.  /* Defines for editor gadgets */
  28.  
  29. #define FIRST_MODE_GADGET    EDITOR_GADGET_CREATE
  30.  
  31. #define EDITOR_GADGET1_TYPE        GADGET_DATA_TYPE_CYCLE
  32. #define EDITOR_GADGET1_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_LEFT)
  33. #define EDITOR_GADGET1_TEXT        "_Type"
  34. #define EDITOR_GADGET1_LEFT_EDGE    (10 + (4 + 1) * 8)
  35. #define EDITOR_GADGET1_TOP_EDGE        5
  36. #define EDITOR_GADGET1_WIDTH        110
  37. #define EDITOR_GADGET1_HEIGHT        15
  38. #define EDITOR_GADGET1_TEXT_ATTR    &topaz80_attr
  39. #define EDITOR_GADGET1_ACTIVE        1
  40. #define EDITOR_GADGET1_TEXT_ARRAY    &template_type_text_array[0]
  41.  
  42. #define EDITOR_GADGET2_TYPE        GADGET_DATA_TYPE_BUTTON
  43. #define EDITOR_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  44. #define EDITOR_GADGET2_LEFT_EDGE    (EDITOR_GADGET1_LEFT_EDGE + EDITOR_GADGET1_WIDTH + 80 + 4 * 8)
  45. #define EDITOR_GADGET2_TOP_EDGE        5
  46. #define EDITOR_GADGET2_WIDTH        ((6 + 3) * 8)
  47. #define EDITOR_GADGET2_HEIGHT        15
  48. #define EDITOR_GADGET2_TEXT        "_Create"
  49. #define EDITOR_GADGET2_TEXT_ATTR    &topaz80_attr
  50.  
  51. #define EDITOR_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  52. #define EDITOR_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  53. #define EDITOR_GADGET3_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE + EDITOR_GADGET2_WIDTH + 10)
  54. #define EDITOR_GADGET3_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  55. #define EDITOR_GADGET3_WIDTH        EDITOR_GADGET2_WIDTH
  56. #define EDITOR_GADGET3_HEIGHT        EDITOR_GADGET2_HEIGHT
  57. #define EDITOR_GADGET3_TEXT        "_Modify"
  58. #define EDITOR_GADGET3_TEXT_ATTR    &topaz80_attr
  59.  
  60. #define EDITOR_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  61. #define EDITOR_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  62. #define EDITOR_GADGET4_LEFT_EDGE    (EDITOR_GADGET3_LEFT_EDGE + EDITOR_GADGET3_WIDTH + 10)
  63. #define EDITOR_GADGET4_TOP_EDGE        EDITOR_GADGET2_TOP_EDGE
  64. #define EDITOR_GADGET4_WIDTH        EDITOR_GADGET2_WIDTH
  65. #define EDITOR_GADGET4_HEIGHT        EDITOR_GADGET2_HEIGHT
  66. #define EDITOR_GADGET4_TEXT        "C_lone"
  67. #define EDITOR_GADGET4_TEXT_ATTR    &topaz80_attr
  68.  
  69. #define EDITOR_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  70. #define EDITOR_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  71. #define EDITOR_GADGET5_LEFT_EDGE    EDITOR_GADGET2_LEFT_EDGE
  72. #define EDITOR_GADGET5_TOP_EDGE        (EDITOR_GADGET2_TOP_EDGE + EDITOR_GADGET2_HEIGHT + 5)
  73. #define EDITOR_GADGET5_WIDTH        EDITOR_GADGET2_WIDTH
  74. #define EDITOR_GADGET5_HEIGHT        EDITOR_GADGET2_HEIGHT
  75. #define EDITOR_GADGET5_TEXT        "_Delete"
  76. #define EDITOR_GADGET5_TEXT_ATTR    &topaz80_attr
  77.  
  78. #define EDITOR_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  79. #define EDITOR_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  80. #define EDITOR_GADGET6_LEFT_EDGE    EDITOR_GADGET3_LEFT_EDGE
  81. #define EDITOR_GADGET6_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  82. #define EDITOR_GADGET6_WIDTH        EDITOR_GADGET2_WIDTH
  83. #define EDITOR_GADGET6_HEIGHT        EDITOR_GADGET2_HEIGHT
  84. #define EDITOR_GADGET6_TEXT        "_Edit"
  85. #define EDITOR_GADGET6_TEXT_ATTR    &topaz80_attr
  86.  
  87. #define EDITOR_GADGET7_TYPE        GADGET_DATA_TYPE_BUTTON
  88. #define EDITOR_GADGET7_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  89. #define EDITOR_GADGET7_LEFT_EDGE    EDITOR_GADGET4_LEFT_EDGE
  90. #define EDITOR_GADGET7_TOP_EDGE        EDITOR_GADGET5_TOP_EDGE
  91. #define EDITOR_GADGET7_WIDTH        EDITOR_GADGET2_WIDTH
  92. #define EDITOR_GADGET7_HEIGHT        EDITOR_GADGET2_HEIGHT
  93. #define EDITOR_GADGET7_TEXT        "_Use"
  94. #define EDITOR_GADGET7_TEXT_ATTR    &topaz80_attr
  95.  
  96. #define EDITOR_GADGET8_TYPE        GADGET_DATA_TYPE_LISTVIEW
  97. #define EDITOR_GADGET8_FLAGS        GADGET_DATA_FLAG_HOTKEY
  98. #define EDITOR_GADGET8_LEFT_EDGE    10
  99. #define EDITOR_GADGET8_TOP_EDGE        (EDITOR_GADGET1_TOP_EDGE + EDITOR_GADGET1_HEIGHT + 19)
  100. #define EDITOR_GADGET8_WIDTH        242
  101. #define EDITOR_GADGET8_HEIGHT        70
  102. #define EDITOR_GADGET8_TEXT        "Defined Tem_plates"
  103. #define EDITOR_GADGET8_TEXT_ATTR    &topaz80_attr
  104. #define EDITOR_GADGET8_SPACING        0
  105. #define EDITOR_GADGET8_TOP        1
  106. #define EDITOR_GADGET8_LIST        NULL
  107.  
  108.  /* Statics & globals for editor main gadgets */
  109.  
  110. BYTE *template_type_text_array[]=
  111. {
  112.     "Border", "Text", "Button", "Check", "Radio", "String", "Integer",
  113.     "Slider", "Scroller", "Cycle", "Count", "Listview", "Palette", NULL
  114. };
  115. STATIC struct GadgetData editor_gadget_data[]=
  116. {
  117.     {
  118.         EDITOR_GADGET1_TYPE,    /* gd_Type */
  119.         EDITOR_GADGET1_FLAGS,    /* gd_Flags */
  120.         EDITOR_GADGET1_LEFT_EDGE,        /* gd_LeftEdge */
  121.         EDITOR_GADGET1_TOP_EDGE,/* gd_TopEdge */
  122.         EDITOR_GADGET1_WIDTH,    /* gd_Width */
  123.         EDITOR_GADGET1_HEIGHT,    /* gd_Height */
  124.         EDITOR_GADGET1_TEXT,    /* *gd_Text */
  125.         EDITOR_GADGET1_TEXT_ATTR,        /* *gd_TextAttr */
  126.         {
  127.             0,                    /* gd_CyclePad */
  128.             EDITOR_GADGET1_ACTIVE,        /* gd_CycleActive */
  129.             EDITOR_GADGET1_TEXT_ARRAY    /* gd_CycleTextArray */
  130.         }
  131.     },
  132.     {
  133.         EDITOR_GADGET2_TYPE,    /* gd_Type */
  134.         EDITOR_GADGET2_FLAGS,    /* gd_Flags */
  135.         EDITOR_GADGET2_LEFT_EDGE,        /* gd_LeftEdge */
  136.         EDITOR_GADGET2_TOP_EDGE,/* gd_TopEdge */
  137.         EDITOR_GADGET2_WIDTH,    /* gd_Width */
  138.         EDITOR_GADGET2_HEIGHT,    /* gd_Height */
  139.         EDITOR_GADGET2_TEXT,    /* *gd_Text */
  140.         EDITOR_GADGET2_TEXT_ATTR,        /* *gd_TextAttr */
  141.         {0, 0, 0}
  142.     },
  143.     {
  144.         EDITOR_GADGET3_TYPE,    /* gd_Type */
  145.         EDITOR_GADGET3_FLAGS,    /* gd_Flags */
  146.         EDITOR_GADGET3_LEFT_EDGE,        /* gd_LeftEdge */
  147.         EDITOR_GADGET3_TOP_EDGE,/* gd_TopEdge */
  148.         EDITOR_GADGET3_WIDTH,    /* gd_Width */
  149.         EDITOR_GADGET3_HEIGHT,    /* gd_Height */
  150.         EDITOR_GADGET3_TEXT,    /* *gd_Text */
  151.         EDITOR_GADGET3_TEXT_ATTR,        /* *gd_TextAttr */
  152.         {0, 0, 0}
  153.     },
  154.     {
  155.         EDITOR_GADGET4_TYPE,    /* gd_Type */
  156.         EDITOR_GADGET4_FLAGS,    /* gd_Flags */
  157.         EDITOR_GADGET4_LEFT_EDGE,        /* gd_LeftEdge */
  158.         EDITOR_GADGET4_TOP_EDGE,/* gd_TopEdge */
  159.         EDITOR_GADGET4_WIDTH,    /* gd_Width */
  160.         EDITOR_GADGET4_HEIGHT,    /* gd_Height */
  161.         EDITOR_GADGET4_TEXT,    /* *gd_Text */
  162.         EDITOR_GADGET4_TEXT_ATTR,        /* *gd_TextAttr */
  163.         {0, 0, 0}
  164.     },
  165.     {
  166.         EDITOR_GADGET5_TYPE,    /* gd_Type */
  167.         EDITOR_GADGET5_FLAGS,    /* gd_Flags */
  168.         EDITOR_GADGET5_LEFT_EDGE,        /* gd_LeftEdge */
  169.         EDITOR_GADGET5_TOP_EDGE,/* gd_TopEdge */
  170.         EDITOR_GADGET5_WIDTH,    /* gd_Width */
  171.         EDITOR_GADGET5_HEIGHT,    /* gd_Height */
  172.         EDITOR_GADGET5_TEXT,    /* *gd_Text */
  173.         EDITOR_GADGET5_TEXT_ATTR,        /* *gd_TextAttr */
  174.         {0, 0, 0}
  175.     },
  176.     {
  177.         EDITOR_GADGET6_TYPE,    /* gd_Type */
  178.         EDITOR_GADGET6_FLAGS,    /* gd_Flags */
  179.         EDITOR_GADGET6_LEFT_EDGE,        /* gd_LeftEdge */
  180.         EDITOR_GADGET6_TOP_EDGE,/* gd_TopEdge */
  181.         EDITOR_GADGET6_WIDTH,    /* gd_Width */
  182.         EDITOR_GADGET6_HEIGHT,    /* gd_Height */
  183.         EDITOR_GADGET6_TEXT,    /* *gd_Text */
  184.         EDITOR_GADGET6_TEXT_ATTR,        /* *gd_TextAttr */
  185.         {0, 0, 0}
  186.     },
  187.     {
  188.         EDITOR_GADGET7_TYPE,    /* gd_Type */
  189.         EDITOR_GADGET7_FLAGS,    /* gd_Flags */
  190.         EDITOR_GADGET7_LEFT_EDGE,        /* gd_LeftEdge */
  191.         EDITOR_GADGET7_TOP_EDGE,/* gd_TopEdge */
  192.         EDITOR_GADGET7_WIDTH,    /* gd_Width */
  193.         EDITOR_GADGET7_HEIGHT,    /* gd_Height */
  194.         EDITOR_GADGET7_TEXT,    /* *gd_Text */
  195.         EDITOR_GADGET7_TEXT_ATTR,        /* *gd_TextAttr */
  196.         {0, 0, 0}
  197.     },
  198.     {
  199.         EDITOR_GADGET8_TYPE,    /* gd_Type */
  200.         EDITOR_GADGET8_FLAGS,    /* gd_Flags */
  201.         EDITOR_GADGET8_LEFT_EDGE,        /* gd_LeftEdge */
  202.         EDITOR_GADGET8_TOP_EDGE,/* gd_TopEdge */
  203.         EDITOR_GADGET8_WIDTH,    /* gd_Width */
  204.         EDITOR_GADGET8_HEIGHT,    /* gd_Height */
  205.         EDITOR_GADGET8_TEXT,    /* *gd_Text */
  206.         EDITOR_GADGET8_TEXT_ATTR,        /* *gd_TextAttr */
  207.         {
  208.             EDITOR_GADGET8_SPACING,        /* gd_ListViewSpacing */
  209.             EDITOR_GADGET8_TOP,    /* gd_ListViewTop */
  210.             EDITOR_GADGET8_LIST    /* gd_ListViewList */
  211.         }
  212.     },
  213.     {
  214.         INTUISUP_DATA_END        /* mark end of gadget data array */
  215.     }
  216. };
  217.  /* Defines for editor texts */
  218.  
  219. #define EDITOR_TEXT1_TYPE    TEXT_DATA_TYPE_TEXT
  220. #define EDITOR_TEXT1_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  221. #define EDITOR_TEXT1_LEFT_EDGE    (EDITOR_GADGET2_LEFT_EDGE - 8)
  222. #define EDITOR_TEXT1_TOP_EDGE    (EDITOR_GADGET2_TOP_EDGE + (EDITOR_GADGET2_HEIGHT - 8) / 2)
  223. #define EDITOR_TEXT1_TEXT    "Mode"
  224. #define EDITOR_TEXT1_TEXT_ATTR    &topaz80_attr
  225.  
  226. #define EDITOR_TEXT2_TYPE    TEXT_DATA_TYPE_TEXT
  227. #define EDITOR_TEXT2_FLAGS    TEXT_DATA_FLAG_BOLD
  228. #define EDITOR_TEXT2_LEFT_EDGE    EDITOR_GADGET5_LEFT_EDGE
  229. #define EDITOR_TEXT2_TOP_EDGE    (EDITOR_GADGET5_TOP_EDGE + EDITOR_GADGET5_HEIGHT + 10)
  230. #define EDITOR_TEXT2_TEXT    "Template Information:"
  231. #define EDITOR_TEXT2_TEXT_ATTR    &topaz80_attr
  232.  
  233. #define EDITOR_TEXT3_TYPE    TEXT_DATA_TYPE_TEXT
  234. #define EDITOR_TEXT3_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  235. #define EDITOR_TEXT3_LEFT_EDGE    (EDITOR_TEXT2_LEFT_EDGE + 20 + 4 * 8)
  236. #define EDITOR_TEXT3_TOP_EDGE    (EDITOR_TEXT2_TOP_EDGE + 14)
  237. #define EDITOR_TEXT3_TEXT    "Name"
  238. #define EDITOR_TEXT3_TEXT_ATTR    &topaz80_attr
  239.  
  240. #define EDITOR_TEXT4_TYPE    TEXT_DATA_TYPE_TEXT
  241. #define EDITOR_TEXT4_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  242. #define EDITOR_TEXT4_LEFT_EDGE    EDITOR_TEXT3_LEFT_EDGE
  243. #define EDITOR_TEXT4_TOP_EDGE    (EDITOR_TEXT3_TOP_EDGE + 12)
  244. #define EDITOR_TEXT4_TEXT    "Type"
  245. #define EDITOR_TEXT4_TEXT_ATTR    &topaz80_attr
  246.  
  247. #define EDITOR_TEXT5_TYPE    TEXT_DATA_TYPE_TEXT
  248. #define EDITOR_TEXT5_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  249. #define EDITOR_TEXT5_LEFT_EDGE    EDITOR_TEXT4_LEFT_EDGE
  250. #define EDITOR_TEXT5_TOP_EDGE    (EDITOR_TEXT4_TOP_EDGE + 12)
  251. #define EDITOR_TEXT5_TEXT    "Pos"
  252. #define EDITOR_TEXT5_TEXT_ATTR    &topaz80_attr
  253.  
  254. #define EDITOR_TEXT6_TYPE    TEXT_DATA_TYPE_TEXT
  255. #define EDITOR_TEXT6_FLAGS    TEXT_DATA_FLAG_PLACE_LEFT
  256. #define EDITOR_TEXT6_LEFT_EDGE    EDITOR_TEXT5_LEFT_EDGE
  257. #define EDITOR_TEXT6_TOP_EDGE    (EDITOR_TEXT5_TOP_EDGE + 12)
  258. #define EDITOR_TEXT6_TEXT    "Size"
  259. #define EDITOR_TEXT6_TEXT_ATTR    &topaz80_attr
  260.  
  261.  /* Statics for texts */
  262.  
  263. STATIC struct TextData editor_text_data[]=
  264. {
  265.     {
  266.         EDITOR_TEXT1_TYPE,        /* td_Type */
  267.         EDITOR_TEXT1_FLAGS,        /* td_Flags */
  268.         EDITOR_TEXT1_LEFT_EDGE,    /* td_LeftEdge */
  269.         EDITOR_TEXT1_TOP_EDGE,    /* td_TopEdge */
  270.         EDITOR_TEXT1_TEXT,        /* *td_Text */
  271.         EDITOR_TEXT1_TEXT_ATTR    /* *td_TextAttr */
  272.     },
  273.     {
  274.         EDITOR_TEXT2_TYPE,        /* td_Type */
  275.         EDITOR_TEXT2_FLAGS,        /* td_Flags */
  276.         EDITOR_TEXT2_LEFT_EDGE,    /* td_LeftEdge */
  277.         EDITOR_TEXT2_TOP_EDGE,    /* td_TopEdge */
  278.         EDITOR_TEXT2_TEXT,        /* *td_Text */
  279.         EDITOR_TEXT2_TEXT_ATTR    /* *td_TextAttr */
  280.     },
  281.     {
  282.         EDITOR_TEXT3_TYPE,        /* td_Type */
  283.         EDITOR_TEXT3_FLAGS,        /* td_Flags */
  284.         EDITOR_TEXT3_LEFT_EDGE,    /* td_LeftEdge */
  285.         EDITOR_TEXT3_TOP_EDGE,    /* td_TopEdge */
  286.         EDITOR_TEXT3_TEXT,        /* *td_Text */
  287.         EDITOR_TEXT3_TEXT_ATTR    /* *td_TextAttr */
  288.     },
  289.     {
  290.         EDITOR_TEXT4_TYPE,        /* td_Type */
  291.         EDITOR_TEXT4_FLAGS,        /* td_Flags */
  292.         EDITOR_TEXT4_LEFT_EDGE,    /* td_LeftEdge */
  293.         EDITOR_TEXT4_TOP_EDGE,    /* td_TopEdge */
  294.         EDITOR_TEXT4_TEXT,        /* *td_Text */
  295.         EDITOR_TEXT4_TEXT_ATTR    /* *td_TextAttr */
  296.     },
  297.     {
  298.         EDITOR_TEXT5_TYPE,        /* td_Type */
  299.         EDITOR_TEXT5_FLAGS,        /* td_Flags */
  300.         EDITOR_TEXT5_LEFT_EDGE,    /* td_LeftEdge */
  301.         EDITOR_TEXT5_TOP_EDGE,    /* td_TopEdge */
  302.         EDITOR_TEXT5_TEXT,        /* *td_Text */
  303.         EDITOR_TEXT5_TEXT_ATTR    /* *td_TextAttr */
  304.     },
  305.     {
  306.         EDITOR_TEXT6_TYPE,        /* td_Type */
  307.         EDITOR_TEXT6_FLAGS,        /* td_Flags */
  308.         EDITOR_TEXT6_LEFT_EDGE,    /* td_LeftEdge */
  309.         EDITOR_TEXT6_TOP_EDGE,    /* td_TopEdge */
  310.         EDITOR_TEXT6_TEXT,        /* *td_Text */
  311.         EDITOR_TEXT6_TEXT_ATTR    /* *td_TextAttr */
  312.     },
  313.     {
  314.         INTUISUP_DATA_END        /* mark end of text data array */
  315.     }
  316. };
  317.  /* Defines for information texts */
  318.  
  319. #define INFO_TEXT_LINES        4
  320.  
  321. #define INFO_TEXT_LEFT_EDGE    (EDITOR_TEXT3_LEFT_EDGE + 8)
  322. #define INFO_TEXT_TOP_EDGE    EDITOR_TEXT3_TOP_EDGE
  323. #define INFO_TEXT_TYPE        TEXT_DATA_TYPE_TEXT
  324. #define INFO_TEXT_FLAGS        TEXT_DATA_FLAG_COLOR2
  325. #define INFO_TEXT_ATTR        EDITOR_TEXT3_TEXT_ATTR
  326.  
  327. #define INFO_TEXT_MAX_WIDTH    (EDITOR_WINDOW_WIDTH - INFO_TEXT_LEFT_EDGE)
  328. #define INFO_TEXT_YOFFSET    (EDITOR_TEXT4_TOP_EDGE - EDITOR_TEXT3_TOP_EDGE)
  329.  
  330. #define INFO_LINE_NAME    0
  331. #define INFO_LINE_TYPE    1
  332. #define INFO_LINE_POS    2
  333. #define INFO_LINE_SIZE    3
  334.  
  335.  /* Defines for menu */
  336.  
  337. #define MENU_TEXT_ATTR    &topaz60_attr
  338.  
  339. #define MENU_PROJECT                0
  340. #define    ITEM_PROJECT_SCREEN        0
  341. #define    ITEM_PROJECT_WINDOW        1
  342. #define    ITEM_PROJECT_NEW            2
  343. #define    ITEM_PROJECT_LOAD            3
  344. #define    ITEM_PROJECT_APPEND        4
  345. #define    ITEM_PROJECT_SAVE            5
  346. #define    ITEM_PROJECT_SAVE_C        6
  347. #define    ITEM_PROJECT_ABOUT            7
  348. #define    ITEM_PROJECT_QUIT            8
  349.  
  350. #define MENU_EDIT                1
  351. #define    ITEM_EDIT_LOCK            0
  352. #define    ITEM_EDIT_UNLOCK            1
  353. #define       SUBITEM_EDIT_UNLOCK_SINGLE    0
  354. #define       SUBITEM_EDIT_UNLOCK_ALL        1
  355. #define    ITEM_EDIT_SNAP            2
  356.  
  357.  /* Statics for menu */
  358.  
  359. STATIC struct MenuData editor_menu_data[]=
  360. {
  361.     {
  362.         MENU_DATA_TYPE_TITLE, 0, "Project"
  363.     },
  364.     {
  365.         MENU_DATA_TYPE_ITEM, 0, "Screen", "R", 0
  366.     },
  367.     {
  368.         MENU_DATA_TYPE_ITEM, 0, "Window", "W", 0
  369.     },
  370.     {
  371.         MENU_DATA_TYPE_ITEM, 0, "New", "N", 0
  372.     },
  373.     {
  374.         MENU_DATA_TYPE_ITEM, 0, "Load", "L", 0
  375.     },
  376.     {
  377.         MENU_DATA_TYPE_ITEM, 0, "Append", "P", 0
  378.     },
  379.     {
  380.         MENU_DATA_TYPE_ITEM, 0, "Save", "S", 0
  381.     },
  382.     {
  383.         MENU_DATA_TYPE_ITEM, 0, "Save as C", "C", 0
  384.     },
  385.     {
  386.         MENU_DATA_TYPE_ITEM, 0, "About", "A", 0
  387.     },
  388.     {
  389.         MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_EMPTY_LINE, "Quit", "Q", 0
  390.     },
  391.     {
  392.         MENU_DATA_TYPE_TITLE, 0, "Edit"
  393.     },
  394.     {
  395.         MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Lock", "L", 0
  396.     },
  397.     {
  398.         MENU_DATA_TYPE_ITEM, MENU_DATA_FLAG_DISABLED, "Unlock", NULL, 0
  399.     },
  400.     {
  401.         MENU_DATA_TYPE_SUBITEM, 0, "Single", "U", 0
  402.     },
  403.     {
  404.         MENU_DATA_TYPE_SUBITEM, 0, "All", NULL, 0
  405.     },
  406.     {
  407.         MENU_DATA_TYPE_ITEM, 0, "Snap", NULL, 0
  408.     },
  409.     {
  410.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE | MENU_DATA_FLAG_SELECTED, "1", NULL, ~(1 << 0)
  411.     },
  412.     {
  413.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "2", NULL, ~(1 << 1)
  414.     },
  415.     {
  416.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "4", NULL, ~(1 << 2)
  417.     },
  418.     {
  419.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "6", NULL, ~(1 << 3)
  420.     },
  421.     {
  422.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "8", NULL, ~(1 << 4)
  423.     },
  424.     {
  425.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "10", NULL, ~(1 << 5)
  426.     },
  427.     {
  428.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "12", NULL, ~(1 << 6)
  429.     },
  430.     {
  431.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "14", NULL, ~(1 << 7)
  432.     },
  433.     {
  434.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "16", NULL, ~(1 << 8)
  435.     },
  436.     {
  437.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "18", NULL, ~(1 << 9)
  438.     },
  439.     {
  440.         MENU_DATA_TYPE_SUBITEM, MENU_DATA_FLAG_ATTRIBUTE, "20", NULL, ~(1 << 10)
  441.     },
  442.     {
  443.         INTUISUP_DATA_END        /* mark end of menu data */
  444.     }
  445. };
  446.  /* Editor action loop */
  447.  
  448. SHORT
  449. editor_action_loop(VOID)
  450. {
  451.     BOOL keepon = TRUE;
  452.     SHORT status = EDITOR_STATUS_NORMAL;
  453.  
  454.     if (!(egl = ICreateGadgets(eri, &editor_gadget_data[0], 0, 0, NULL)))
  455.     {
  456.         status = EDITOR_ERROR_OUT_OF_MEM;
  457.     }
  458.     else
  459.     {
  460.         if (!(eml = ICreateMenu(eri, ewin, &editor_menu_data[0],
  461.                                 MENU_TEXT_ATTR, NULL)))
  462.         {
  463.             status = EDITOR_ERROR_OUT_OF_MEM;
  464.         }
  465.         else
  466.         {
  467.             struct TemplateList *tl = &template_list;
  468.             struct MsgPort *eup = ewin->UserPort, *pup = pwin->UserPort;
  469.             LONG emask = 1L << eup->mp_SigBit, pmask = 1L << pup->mp_SigBit, full_mask = emask | pmask;
  470.  
  471. /*     project_file_requester->fr_Flags2 |= FR2F_LongPath;
  472.          strcpy(project_file_requester->fr_File, DEFAULT_PROJECT_FILE_NAME);
  473.  
  474.          csource_file_requester->fr_FuncFlags |= FRF_DoColor;
  475.          csource_file_requester->fr_Flags2    |= FR2F_LongPath;
  476.          csource_file_requester->fr_Hail       = CSOURCE_SAVE_HAIL_TEXT;
  477.          strcpy(csource_file_requester->fr_File, DEFAULT_CSOURCE_FILE_NAME);
  478. */
  479.  
  480.             /* Init template list */
  481.             NewList((struct List *) & tl->tl_Fonts);
  482.             NewList((struct List *) & tl->tl_Templates);
  483.             strcpy(&tl->tl_ProjectID[0], DEFAULT_PROJECT_ID);
  484.             change_project_name(tl, DEFAULT_PROJECT_NAME, -1);
  485.  
  486.             /* Set gadget defaults */
  487.             ISetGadgetAttributes(egl, EDITOR_GADGET_TYPE, 0L, 0L, USE_CURRENT_VALUE,
  488.                                  (LONG) DEFAULT_TEMPLATE_TYPE, (VOID *) USE_CURRENT_VALUE);
  489.             ISetGadgetAttributes(egl, FIRST_MODE_GADGET + DEFAULT_EDITOR_MODE,
  490.                                  0L, 0L, 1L, USE_CURRENT_VALUE, (VOID *) USE_CURRENT_VALUE);
  491.             print_project_window_title();
  492.  
  493.             /* Editor main loop */
  494.             do
  495.             {
  496.                 struct Message *msg;
  497.                 SHORT last_status;
  498.  
  499.                 /* Remove all IDCMP events from editor and project window */
  500.                 while (msg = GetMsg(eup))
  501.                 {
  502.                     ReplyMsg(msg);
  503.                 }
  504.                 while (msg = GetMsg(pup))
  505.                 {
  506.                     ReplyMsg(msg);
  507.                 }
  508.  
  509.                 /* Display editor texts and gadgets, start use mode and attach menu */
  510.                 IClearWindow(eri, ewin, 0, 0, EDITOR_WINDOW_WIDTH,
  511.                              EDITOR_WINDOW_HEIGHT, 0);
  512.                 IDisplayTexts(eri, ewin, &editor_text_data[0], 0, 0, NULL);
  513.                 IDisplayGadgets(ewin, egl);
  514.                 IAttachMenu(ewin, eml);
  515.                 if (editor_mode == EDITOR_MODE_USE)
  516.                 {
  517.                     start_gadget_use_mode();
  518.                 }
  519.  
  520.                 /* Editor IDCMP loop */
  521.                 do
  522.                 {
  523.                     LONG signals = Wait(full_mask);
  524.  
  525.                     if (signals & emask)
  526.                     {
  527.                         status = perform_editor_action();
  528.                     }
  529.                     if (signals & pmask)
  530.                     {
  531.                         status = perform_project_action();
  532.                     }
  533.                 }
  534.                 while (status <= EDITOR_STATUS_NORMAL);
  535.  
  536.                 /* Remove editor gadgets, end gadget use mode and remove menu */
  537.                 IRemoveGadgets(egl);
  538.                 if (editor_mode == EDITOR_MODE_USE)
  539.                 {
  540.                     end_gadget_use_mode();
  541.                 }
  542.                 IRemoveMenu(eml);
  543.  
  544.                 /* Perform special action given by status */
  545.                 switch (last_status = status)
  546.                 {
  547.                 case EDITOR_STATUS_EDIT:
  548.                     if (selected_template)
  549.                     {
  550.                         status = edit_template_data();
  551.                     }
  552.                     break;
  553.  
  554.                 case EDITOR_STATUS_SCREEN:
  555.                     status = change_project_screen();
  556.                     break;
  557.  
  558.                 case EDITOR_STATUS_WINDOW:
  559.                     status = change_project_window();
  560.                     break;
  561.  
  562.                 case EDITOR_STATUS_NEW:
  563.                     if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  564.                         ok_cancel_requester(" New ", "Project changed and"
  565.                                             " not saved.\\n\\nDo you really"
  566.                                             " want to start a new project?") == TRUE)
  567.                     {
  568.                         status = new_project(tl,
  569.                                              TEMPLATE_LIST_FLAG_DEFAULT_WINDOW);
  570.                     }
  571.                     break;
  572.  
  573.                 case EDITOR_STATUS_LOAD:
  574.                     if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  575.                         ok_cancel_requester(" Load ", "Project changed and"
  576.                                             " not saved.\\n\\nDo you really"
  577.                                             " want to load a new project?") == TRUE)
  578.                     {
  579.                         status = load_project(LOAD_MODE_NORMAL);
  580.                     }
  581.                     break;
  582.  
  583.                 case EDITOR_STATUS_APPEND:
  584.                     if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  585.                         ok_cancel_requester(" Append ", "Project changed and"
  586.                                             " not saved.\\n\\nDo you really"
  587.                                             " want to append a new project?") == TRUE)
  588.                     {
  589.                         status = load_project(LOAD_MODE_APPEND);
  590.                     }
  591.                     break;
  592.  
  593.                 case EDITOR_STATUS_SAVE:
  594.                     status = save_project();
  595.                     break;
  596.  
  597.                 case EDITOR_STATUS_SAVE_C:
  598.                     status = save_c_source();
  599.                     break;
  600.  
  601.                 case EDITOR_STATUS_ABOUT:
  602.                     about_requester();
  603.                     break;
  604.  
  605.                 case EDITOR_ERROR_NO_WINDOW:
  606.                     keepon = FALSE;
  607.                     break;
  608.                 }
  609.                 if (last_status == EDITOR_STATUS_WINDOW || last_status ==
  610.                     EDITOR_STATUS_NEW || last_status == EDITOR_STATUS_LOAD)
  611.                 {
  612.  
  613.                     /* Get user port data from new project window */
  614.                     pup = pwin->UserPort;
  615.                     pmask = 1L << pup->mp_SigBit;
  616.                     full_mask = emask | pmask;
  617.                 }
  618.                 if (status == EDITOR_STATUS_QUIT)
  619.                 {
  620.                     if (!(tl->tl_Flags & TEMPLATE_LIST_FLAG_CHANGED) ||
  621.                         ok_cancel_requester(" Quit ", "Project changed and not"
  622.                                             " saved.\\n\\nDo you really want to quit?") == TRUE)
  623.                     {
  624.                         keepon = FALSE;
  625.                     }
  626.                 }
  627.             }
  628.             while (keepon == TRUE);
  629.  
  630.             /* Free resources */
  631.             free_template_list(tl);
  632.             IFreeMenu(eml);
  633.         }
  634.         IFreeGadgets(egl);
  635.     }
  636.     return (status);
  637. }
  638.  
  639.  /* Perform editor action */
  640.  
  641. STATIC SHORT
  642. perform_editor_action(VOID)
  643. {
  644.     struct MsgPort *up = ewin->UserPort;
  645.     struct IntuiMessage *msg;
  646.     SHORT status = EDITOR_STATUS_NORMAL;
  647.  
  648.     while (msg = IGetMsg(up))
  649.     {
  650.         USHORT entry, code = msg->Code;
  651.         LONG value;
  652.  
  653.         switch (msg->Class)
  654.         {
  655.         case CLOSEWINDOW:
  656.             status = EDITOR_STATUS_QUIT;
  657.             break;
  658.  
  659.         case ISUP_ID:
  660.             entry = code;
  661.             value = (LONG) msg->IAddress;
  662.             switch (entry)
  663.             {
  664.             case EDITOR_GADGET_TYPE:
  665.                 template_type = value;
  666.                 print_project_window_title();
  667.                 break;
  668.  
  669.             case EDITOR_GADGET_TEMPLATES:
  670.                 clear_template_info();
  671.                 if (get_template_by_num(value))
  672.                 {
  673.                     print_template_info();
  674.                 }
  675.                 break;
  676.  
  677.             default:
  678.                 change_editor_mode(entry, value);
  679.                 break;
  680.             }
  681.             break;
  682.  
  683.         case MENUPICK:
  684.             while (code != MENUNULL)
  685.             {
  686.                 switch (MENUNUM(code))
  687.                 {
  688.                 case MENU_PROJECT:
  689.                     switch (ITEMNUM(code))
  690.                     {
  691.  
  692.                     case ITEM_PROJECT_SCREEN:
  693.                         status = EDITOR_STATUS_SCREEN;
  694.                         break;
  695.  
  696.                     case ITEM_PROJECT_WINDOW:
  697.                         status = EDITOR_STATUS_WINDOW;
  698.                         break;
  699.  
  700.                     case ITEM_PROJECT_NEW:
  701.                         status = EDITOR_STATUS_NEW;
  702.                         break;
  703.  
  704.                     case ITEM_PROJECT_LOAD:
  705.                         status = EDITOR_STATUS_LOAD;
  706.                         break;
  707.  
  708.                     case ITEM_PROJECT_APPEND:
  709.                         status = EDITOR_STATUS_APPEND;
  710.                         break;
  711.  
  712.                     case ITEM_PROJECT_SAVE:
  713.                         status = EDITOR_STATUS_SAVE;
  714.                         break;
  715.  
  716.                     case ITEM_PROJECT_SAVE_C:
  717.                         status = EDITOR_STATUS_SAVE_C;
  718.                         break;
  719.  
  720.                     case ITEM_PROJECT_ABOUT:
  721.                         status = EDITOR_STATUS_ABOUT;
  722.                         break;
  723.  
  724.                     case ITEM_PROJECT_QUIT:
  725.                         status = EDITOR_STATUS_QUIT;
  726.                         break;
  727.                     }
  728.                     break;
  729.                 case MENU_EDIT:
  730.                     switch (ITEMNUM(code))
  731.                     {
  732.                     case ITEM_EDIT_SNAP:
  733.                         snap_offset = snap_offset_table[SUBNUM(code)];
  734.                         break;
  735.                     }
  736.                     break;
  737.                 }
  738.                 code = IMenuItemAddress(eml, code)->NextSelect;
  739.             }
  740.             break;
  741.         }
  742.         IReplyMsg(msg);
  743.     }
  744.     return (status);
  745. }
  746.  
  747.  /* Change editor mode */
  748.  
  749. STATIC VOID
  750. change_editor_mode(USHORT gadget, LONG value)
  751. {
  752.     UBYTE new_mode = gadget - FIRST_MODE_GADGET;
  753.     USHORT active_mode_gadget = editor_mode + FIRST_MODE_GADGET;
  754.  
  755.     if (gadget == active_mode_gadget)
  756.     {
  757.  
  758.         /* If active mode gadget deselected so select it again */
  759.         ISetGadgetAttributes(egl, gadget, 0L, 0L, 1L, USE_CURRENT_VALUE,
  760.                              (VOID *) USE_CURRENT_VALUE);
  761.     }
  762.     else
  763.     {
  764.  
  765.         /* Deselect active mode gadget and set new editor mode */
  766.         ISetGadgetAttributes(egl, active_mode_gadget, 0L, 0L, 0L,
  767.                              USE_CURRENT_VALUE, (VOID *) USE_CURRENT_VALUE);
  768.  
  769.         /* Toggle gadget use mode */
  770.         if (new_mode == EDITOR_MODE_USE)
  771.         {
  772.             start_gadget_use_mode();
  773.         }
  774.         else
  775.         {
  776.             if (editor_mode == EDITOR_MODE_USE)
  777.             {
  778.                 end_gadget_use_mode();
  779.             }
  780.         }
  781.         editor_mode = new_mode;
  782.         print_project_window_title();
  783.     }
  784. }
  785.  
  786.  /* Print infos about current selected template info */
  787.  
  788. VOID
  789. print_template_info(VOID)
  790. {
  791.     struct Template *tp = selected_template;
  792.     USHORT i, top_edge = INFO_TEXT_TOP_EDGE;
  793.  
  794.     /* First clear old info texts */
  795.     if (info_displayed == TRUE)
  796.     {
  797.         IClearWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  798.                      INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  799.                      INFO_TEXT_YOFFSET - 1, 0);
  800.         draw_box_with_border(pwin, &info_template->tp_Box);
  801.     }
  802.  
  803.     /* Now print new info texts */
  804.     for (i = 0; i < INFO_TEXT_LINES; i++)
  805.     {
  806.         BYTE text[80];
  807.  
  808.         switch (i)
  809.         {
  810.         case INFO_LINE_NAME:
  811.             sprintf(&text[0], "%s", &tp->tp_TemplateName[0]);
  812.             break;
  813.  
  814.         case INFO_LINE_TYPE:
  815.             sprintf(&text[0], "%s", template_type_text_array[tp->tp_Type]);
  816.             break;
  817.  
  818.         case INFO_LINE_POS:
  819.             sprintf(&text[0], "%d,%d", tp->tp_Box.bo_X1, tp->tp_Box.bo_Y1);
  820.             break;
  821.  
  822.         case INFO_LINE_SIZE:
  823.             sprintf(&text[0], "%dx%d", tp->tp_Box.bo_X2 - tp->tp_Box.bo_X1 +
  824.                     1, tp->tp_Box.bo_Y2 - tp->tp_Box.bo_Y1 + 1);
  825.             break;
  826.         }
  827.         IPrintText(eri, ewin, &text[0], INFO_TEXT_LEFT_EDGE, top_edge,
  828.                    INFO_TEXT_TYPE, INFO_TEXT_FLAGS, INFO_TEXT_ATTR);
  829.         top_edge += INFO_TEXT_YOFFSET;
  830.     }
  831.     draw_box_with_border(pwin, &tp->tp_Box);
  832.     info_template = tp;
  833.     info_displayed = TRUE;
  834. }
  835.  
  836.  /* Clear template info */
  837.  
  838. VOID
  839. clear_template_info(VOID)
  840. {
  841.     if (info_displayed == TRUE)
  842.     {
  843.         IClearWindow(eri, ewin, INFO_TEXT_LEFT_EDGE, INFO_TEXT_TOP_EDGE,
  844.                      INFO_TEXT_MAX_WIDTH, INFO_TEXT_TOP_EDGE + INFO_TEXT_LINES *
  845.                      INFO_TEXT_YOFFSET - 1, 0);
  846.         draw_box_with_border(pwin, &info_template->tp_Box);
  847.         info_template = NULL;
  848.         info_displayed = FALSE;
  849.     }
  850. }
  851.  
  852.  /* Start gadget use mode */
  853.  
  854. VOID
  855. start_gadget_use_mode(VOID)
  856. {
  857.     struct TemplateList *tl = &template_list;
  858.     USHORT num = tl->tl_GadgetTemplates;
  859.     SHORT status = EDITOR_STATUS_NORMAL;
  860.  
  861.     if (num)
  862.     {
  863.         struct GadgetData *gd;
  864.  
  865.         if (!(use_gd = gd = AllocMem((LONG) (num + 1) *
  866.                                      sizeof(struct GadgetData), (LONG) MEMF_PUBLIC)))
  867.         {
  868.             status = EDITOR_ERROR_OUT_OF_MEM;
  869.         }
  870.         else
  871.         {
  872.             struct Template *tp;
  873.  
  874.             for (tp = get_head((struct List *) & tl->tl_Templates); tp;
  875.                  tp = get_succ(&tp->tp_Node))
  876.             {
  877.                 if (TEMPLATE_GROUP(tp) == TEMPLATE_GROUP_GADGET)
  878.                 {
  879.                     CopyMem((BYTE *) & tp->tp_Data.tp_GadgetData, (BYTE *) gd++,
  880.                             (LONG) sizeof(struct GadgetData));
  881.                 }
  882.             }
  883.             gd->gd_Type = INTUISUP_DATA_END;    /* mark end of gadget data array */
  884.             if (!(use_gl = ICreateGadgets(pri, use_gd, 0, 0, NULL)))
  885.             {
  886.                 FreeMem(use_gd, (LONG) (num + 1) * sizeof(struct GadgetData));
  887.                 status = EDITOR_ERROR_OUT_OF_MEM;
  888.             }
  889.             else
  890.             {
  891.                 IDisplayGadgets(pwin, use_gl);
  892.             }
  893.         }
  894.         show_error(status);
  895.     }
  896. }
  897.  
  898.  /* End gadget use mode */
  899.  
  900. VOID
  901. end_gadget_use_mode(VOID)
  902. {
  903.     USHORT num = template_list.tl_GadgetTemplates;
  904.  
  905.     if (num)
  906.     {
  907.         IRemoveGadgets(use_gl);
  908.         IFreeGadgets(use_gl);
  909.         FreeMem(use_gd, (LONG) (num + 1) * sizeof(struct GadgetData));
  910.     }
  911. }
  912.